<?php

namespace CZan\Utils;


class Encrypt
{
    /**
     * 压缩数据
     * @param string $Data
     * @return string
     */
    public static function compressData($Data = '')
    {
        if (empty($Data)) {
            return '';
        } else {
            //第一步：把 HTML 实体转换为字符
            $Data = html_entity_decode($Data, ENT_COMPAT);
            //第二步：压缩数据
            $Data = gzcompress($Data, 9);
            //第三步：base64编码后入库，防止乱码
            $Data = base64_encode($Data);
            return $Data;
        }
    }

    /**
     * 解压数据
     * @param string $Data
     * @return string
     */
    public static function uncompressData($Data = '')
    {
        if (empty($Data)) {
            return '';
        } else {
            //第一步：base64解码
            $Data = base64_decode($Data);
            //第二步：解压数据
            $Data = gzuncompress($Data);
            //第三步：字符串转数组
            return $Data;
        }
    }

    /**
     * 简单对称加密算法之加密
     *
     * @param String $string 需要加密的字串
     * @param String $skey 加密EKY
     *
     * @return String
     * @author Anyon Zou <cxphp@qq.com>
     * @date 2013-08-13 19:30
     * @update 2014-01-21 28:28
     */
    public static function encode($string = '', $skey = 'cxphp')
    {
        $skey = str_split(base64_encode($skey));
        $strArr = str_split(base64_encode($string));
        $strCount = count($strArr);
        foreach ($skey as $key => $value) {
            $key < $strCount && $strArr[$key] .= $value;
        }

        return str_replace('=', 'O0O0O', join('', $strArr));
    }

    /**
     * 简单对称加密算法之解密
     *
     * @param String $string 需要解密的字串
     * @param String $skey 解密KEY
     *
     * @return String
     * @author Anyon Zou <cxphp@qq.com>
     * @date 2013-08-13 19:30
     * @update 2014-01-21 28:28
     */
    public static function decode($string = '', $skey = 'cxphp')
    {
        $skey = str_split(base64_encode($skey));
        $strArr = str_split(str_replace('O0O0O', '=', $string), 2);
        $strCount = count($strArr);
        foreach ($skey as $key => $value) {
            $key < $strCount && $strArr[$key][1] === $value && $strArr[$key] = $strArr[$key][0];
        }

        return base64_decode(join('', $strArr));
    }

    /**
     * 签名生成算法
     *
     * @param array $params API调用的请求参数集合的关联数组，不包含sign参数
     * @param string $secret 签名的密钥即获取access token时返回的session secret
     *
     * @return string 返回参数签名值
     */
    public static function getSignature($params, $secret)
    {
        $str = ''; // 待签名字符串
        ksort($params);// 先将参数以其参数名的字典序升序进行排序
        foreach ($params as $k => $v) {// 遍历排序后的参数数组中的每一个key/value对
            $str .= "$k=$v";// 为key/value对生成一个key=value格式的字符串，并拼接到待签名字符串后面
        }
        $str .= $secret;// 将签名密钥拼接到签名字符串最后面
        return md5($str);// 通过md5算法为签名字符串生成一个md5签名，该签名就是我们要追加的sign参数值
    }

}
